package matematicadiscretaxml;


import java.awt.Color;
import java.awt.Component;
import java.util.ArrayList;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Main.java
 *
 * Created on 09/09/2011, 10:01:47 PM
 */

/**
 *
 * @author diego
 */
public class Main extends javax.swing.JFrame {

    /** Creates new form Main */
    public Main() {
        initComponents();
        this.setSize(770, 467);
//        this.setExtendedState(this.ICONIFIED);
    }

    private ArrayList lista_errores = new ArrayList();

    private javax.swing.JTable jTable_Resultado = new javax.swing.JTable() {
       public Component prepareRenderer(TableCellRenderer renderer,
             int row, int column) {
          JLabel label = (JLabel) super.prepareRenderer(renderer, row, column);
//          if (row == 0 || column == 0) {
//             label.setBackground(new  Color(126, 234, 119));
//          } else {
             label.setBackground(Color.WHITE);
//          }
          return label;
       }};

    public enum sentenciaSQL
    {
        SELECT, FROM, WHERE;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTextAreaSQL = new javax.swing.JTextArea();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane3 = new javax.swing.JScrollPane();
        jToolBar1 = new javax.swing.JToolBar();
        jButtonEjecutar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("MATEMATICA DISCRETA");
        setBounds(new java.awt.Rectangle(0, 0, 800, 650));
        getContentPane().setLayout(null);

        jTextAreaSQL.setColumns(20);
        jTextAreaSQL.setRows(5);
        jScrollPane1.setViewportView(jTextAreaSQL);

        getContentPane().add(jScrollPane1);
        jScrollPane1.setBounds(10, 50, 750, 100);

        jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
        jPanel1.add(jScrollPane3, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 740, 220));

        jTabbedPane1.addTab("RESULTADO", jPanel1);

        getContentPane().add(jTabbedPane1);
        jTabbedPane1.setBounds(10, 160, 750, 270);

        jToolBar1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);

        jButtonEjecutar.setLabel("Ejecutar");
        jButtonEjecutar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonEjecutarActionPerformed(evt);
            }
        });
        jToolBar1.add(jButtonEjecutar);

        getContentPane().add(jToolBar1);
        jToolBar1.setBounds(0, 0, 770, 30);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButtonEjecutarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonEjecutarActionPerformed

//        jPBarBarraProgreso.setMinimum(0);
//        jPBarBarraProgreso.setMaximum(500);
//        jPBarBarraProgreso.setValue(jPBarBarraProgreso.getValue()+1);
        limpiarListas();
        AnalizadorLexico obj_ana_lex = new AnalizadorLexico(jTextAreaSQL.getText().trim());
        obj_ana_lex.generarTokens();

        for (int i = 0 ; i<obj_ana_lex.getLista_tokens().size(); i++)
        {
            System.out.println( ((Lexema)obj_ana_lex.getLista_tokens().get(i)).getLexema() +" : "+((Lexema)obj_ana_lex.getLista_tokens().get(i)).getTipo_lexema() );
        }

        lista_errores = obj_ana_lex.getLista_errores_lex();
        if(lista_errores.isEmpty())
        {
            if( !obj_ana_lex.getLista_tokens().isEmpty() )
            {
                AnalizadorSintactico obj_ana_sint = new AnalizadorSintactico(obj_ana_lex.getLista_tokens());
                obj_ana_sint.generarArbolSintactico();
                if(obj_ana_sint.getLista_errores_sint().isEmpty())
                {
                    System.out.println("*%*********************************"+jTabbedPane1.getTitleAt(0));
                    jTabbedPane1.setTitleAt(0, "RESULTADOS ("+obj_ana_sint.tabla_obj_query.length+")");
                    
                    if(obj_ana_sint.tabla_obj_query.length!=0)
                    {
                        generarTabla(obj_ana_sint.tabla_obj_query);
                    }
                    else
                    {
                        ObjetoQuery[][] obj_query_aux = new ObjetoQuery[1][1];
                        obj_query_aux[0][0] = new ObjetoQuery("CAMBIOS EFECTUADOS", "CAMBIOS EFECTUADOS", "LOS CAMBIOS SE EFECTUARON CORRECTAMENTE");
                        
                        generarTabla(obj_query_aux);
                    }
                    
                    
                }
                else
                {
                    jTabbedPane1.setTitleAt(0, "RESULTADOS (ERRORES)");
                    
                    ObjetoQuery[][] obj_query_aux = new ObjetoQuery[obj_ana_sint.getLista_errores_sint().size()][2];
                    
                    for(int k = 0; k<obj_ana_sint.getLista_errores_sint().size(); k++)
                    {
                        obj_query_aux[k][0] = new ObjetoQuery("ERROR", "tipo", ((Error)obj_ana_sint.getLista_errores_sint().get(k)).getTipo_error() );
                        obj_query_aux[k][1] = new ObjetoQuery("ERROR", "descripcion", ((Error)obj_ana_sint.getLista_errores_sint().get(k)).getMensaje_error());
                                
                    }
                    lista_errores = obj_ana_sint.getLista_errores_sint();
                    generarTabla(obj_query_aux);
                    imprimirLista(lista_errores);
                }
            }
            else
            {
                lista_errores.add(new Error("CADENA SQL VACIA", "DEBEN INGRESAR UNA SENTENCIA SQL"));
                imprimirLista(lista_errores);
                JOptionPane.showMessageDialog(this, "DEBEN INGRESAR UNA SENTENCIA SQL");
            }
        }
        else
        {
            imprimirLista(lista_errores);
        }
        
        // TODO add your handling code here:
    }//GEN-LAST:event_jButtonEjecutarActionPerformed

    public void generarTabla(ObjetoQuery [][] _tabla_obj_query)
    {
        ModeloTabla modelo_tabla = new ModeloTabla(_tabla_obj_query);
        jTable_Resultado.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        jTable_Resultado.setModel(modelo_tabla);
        jTable_Resultado.setRowHeight(30);

        TableColumnModel modeloColumna = jTable_Resultado.getColumnModel();
        TableColumn columnaTabla;
        for(int i = 0; i < modelo_tabla.getColumnCount(); i++)
        {
            columnaTabla = modeloColumna.getColumn(i);
            columnaTabla.setPreferredWidth(80);
        }
        jScrollPane3.setViewportView(jTable_Resultado);

    }

    public void limpiarListas()
    {
         lista_errores.clear();
    }

    public void imprimirLista(ArrayList lista)
    {
        for (int i = 0 ; i<lista.size(); i++)
        {
            System.out.println( ((Error)lista.get(i)).getTipo_error()+" | "+ ((Error)lista.get(i)).getMensaje_error());
        }
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButtonEjecutar;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTextArea jTextAreaSQL;
    private javax.swing.JToolBar jToolBar1;
    // End of variables declaration//GEN-END:variables

}
